package com.continautos.common.web;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;

import com.continautos.common.enums.ETipoParametro;
import com.continautos.common.enums.ETipoUsuario;
import com.continautos.common.persistence.DAOFactory;
import com.continautos.common.persistence.dto.CtaTbConcesionario;
import com.continautos.common.persistence.dto.CtaTbPg;
import com.continautos.common.persistence.exceptions.CtaTbConcesionarioDaoException;
import com.continautos.common.persistence.exceptions.CtaTbPgDaoException;
import com.continautos.common.util.WebUtils;

@ManagedBean(name = "cacheParametrosBean")
@SessionScoped
public class CacheParametrosBean implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private String pathContexto = "";
	private String pathArchivos = "";
	
	
    private static CacheParametrosBean instance;	
	
    // Para acceder desde clases
	public static synchronized CacheParametrosBean getInstance() {
		if( instance == null ) {
			instance = new CacheParametrosBean();
		}
		
		return instance;
	}
	
    
	// TODO: FALTA DEFINIR LA CARGA DE CACHE AL SELECCIONAR EPS / IPS
	private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
	private CtaTbPg [] tiposUsuarios = null; 
	private List<SelectItem> tiposUsuariosList = null;
	private List<SelectItem> estadosList = null;
	private List<SelectItem> empresaList = null; 
	private List<SelectItem> tiposOrigenList = null;
	private CtaTbPg [] tiposOrigen = null; 

	private CtaTbPg [] tiposVehiculo = null; 
	private List<SelectItem> tiposVehiculoList = null;
	
	
	private CtaTbConcesionario [] concesionarios = null; 
	private List<SelectItem> concesionariosList = null;
	
	public SimpleDateFormat getDateFormat() {
		return dateFormat;
	}


	public void setDateFormat(SimpleDateFormat dateFormat) {
		this.dateFormat = dateFormat;
	}


	@ManagedProperty("#{userSessionBean}")
	private UserSessionBean userSessionBean;
	
	public CacheParametrosBean(){
		
		//estados de activo/inactivo
		estadosList = new ArrayList<SelectItem>();
		estadosList.add(new SelectItem("A", "Activo"));
		estadosList.add(new SelectItem("I", "Inactivo"));
		
		try {
			tiposUsuarios = DAOFactory.getCtaTbPgDao().findByCtaTbTp(ETipoParametro.TIPO_USUARIO.getValue());
			tiposUsuariosList = WebUtils.createSelectItem(tiposUsuarios, false);
			
			tiposOrigen = DAOFactory.getCtaTbPgDao().findByCtaTbTp(ETipoParametro.TIPO_ORIGEN.getValue());
			tiposOrigenList = WebUtils.createSelectItem(tiposOrigen, false);
			
			tiposVehiculo = DAOFactory.getCtaTbPgDao().findByCtaTbTp(ETipoParametro.TIPO_VEHICULO.getValue());
			tiposVehiculoList = WebUtils.createSelectItem(tiposVehiculo, false);
			
			concesionarios = DAOFactory.getCtaTbConcesionarioDao().findAll();
			concesionariosList = WebUtils.createSelectItem(concesionarios, false);
			
		} catch (CtaTbPgDaoException e) {
			e.printStackTrace();
		} catch (CtaTbConcesionarioDaoException e) {
			e.printStackTrace();
		} 
		
		pathContexto = ((ServletContext) FacesContext
				.getCurrentInstance().getExternalContext().getContext())
				.getRealPath("/");
		
		pathArchivos = "resources/img/upload/";
	}



	public ETipoUsuario obtenerTipoUsuario(int id){
		
		ETipoUsuario result=null;
		
		for(int i=0;i<tiposUsuarios.length;i++){
			
			if(id == tiposUsuarios[i].getId()){
				if(tiposUsuarios[i].getCodigoExterno().equals(ETipoUsuario.ADMINISTRADOR.getValue())){
					result=ETipoUsuario.ADMINISTRADOR;break;
				}
				if(tiposUsuarios[i].getCodigoExterno().equals(ETipoUsuario.ANFITRION.getValue())){
					result=ETipoUsuario.ANFITRION;break;
				}
				if(tiposUsuarios[i].getCodigoExterno().equals(ETipoUsuario.ASESOR.getValue())){
					result=ETipoUsuario.ASESOR;break;
				}
			}
			
		}
		
		return result;
	}
	


	/**
	 * @return the userSessionBean
	 */
	public UserSessionBean getUserSessionBean() {
		return userSessionBean;
	}


	/**
	 * @param userSessionBean the userSessionBean to set
	 */
	public void setUserSessionBean(UserSessionBean userSessionBean) {
		this.userSessionBean = userSessionBean;
	}


	public CtaTbPg[] getTiposUsuarios() {
		return tiposUsuarios;
	}


	public void setTiposUsuarios(CtaTbPg[] tiposUsuarios) {
		this.tiposUsuarios = tiposUsuarios;
	}


	public List<SelectItem> getTiposUsuariosList() {
		return tiposUsuariosList;
	}


	public void setTiposUsuariosList(List<SelectItem> tiposUsuariosList) {
		this.tiposUsuariosList = tiposUsuariosList;
	}


	public List<SelectItem> getEstadosList() {
		return estadosList;
	}


	public void setEstadosList(List<SelectItem> estadosList) {
		this.estadosList = estadosList;
	}


	public String getPathContexto() {
		return pathContexto;
	}


	public void setPathContexto(String pathContexto) {
		this.pathContexto = pathContexto;
	}


	public String getPathArchivos() {
		return pathArchivos;
	}


	public void setPathArchivos(String pathArchivos) {
		this.pathArchivos = pathArchivos;
	}


	public List<SelectItem> getEmpresaList() {
		return empresaList;
	}


	public void setEmpresaList(List<SelectItem> empresaList) {
		this.empresaList = empresaList;
	}


	public List<SelectItem> getTiposOrigenList() {
		return tiposOrigenList;
	}


	public void setTiposOrigenList(List<SelectItem> tiposOrigenList) {
		this.tiposOrigenList = tiposOrigenList;
	}


	public CtaTbPg[] getTiposOrigen() {
		return tiposOrigen;
	}


	public void setTiposOrigen(CtaTbPg[] tiposOrigen) {
		this.tiposOrigen = tiposOrigen;
	}


	public CtaTbPg[] getTiposVehiculo() {
		return tiposVehiculo;
	}


	public void setTiposVehiculo(CtaTbPg[] tiposVehiculo) {
		this.tiposVehiculo = tiposVehiculo;
	}


	public List<SelectItem> getTiposVehiculoList() {
		return tiposVehiculoList;
	}


	public void setTiposVehiculoList(List<SelectItem> tiposVehiculoList) {
		this.tiposVehiculoList = tiposVehiculoList;
	}


	public CtaTbConcesionario[] getConcesionarios() {
		return concesionarios;
	}


	public void setConcesionarios(CtaTbConcesionario[] concesionarios) {
		this.concesionarios = concesionarios;
	}


	public List<SelectItem> getConcesionariosList() {
		return concesionariosList;
	}


	public void setConcesionariosList(List<SelectItem> concesionariosList) {
		this.concesionariosList = concesionariosList;
	}

}
